package com.shujia.network.tcp;

import org.junit.Test;

import java.io.*;
import java.net.InetAddress;
import java.net.ServerSocket;
import java.net.Socket;

// 实现一个图片下载的功能
public class TcpTest2 {


    @Test
    public void client() throws IOException {
        // 指定ip地址和端口号
        Socket s = new Socket(InetAddress.getLocalHost(), 6666);

        // 搜索加下载资源, 随机下载, 电影分类 category, 电影时长, 80-150分钟
        // 电影名称 name 包含了 友情
        // 使用对象流实现Socket对象的传递
        MovieKeyWord keyWord = new MovieKeyWord("友情", "灾难片", "80-150");
        ObjectOutputStream oos = new ObjectOutputStream(s.getOutputStream());
        oos.writeObject(keyWord);

        // 使用对象写基本数据类型, 需要手动刷新

        // 读取文件到内存
        InputStream is = s.getInputStream();
        OutputStream os = new FileOutputStream("file\\download.jpg");

        byte[] bys = new byte[1024];
        int len;
        // server不会自己关闭, 需要client的通知
        // client写入完成, server不需要阻塞等待了,跳出循环
        while ((len = is.read(bys)) != -1) {
            os.write(bys, 0, len);
        }

        // 关闭资源
        os.close();
        is.close();
        oos.close();
        s.close();

    }


    // 客户端发送文件给服务端，服务端将文件保存在本地。
    @Test
    public void server() throws Exception {
        // 监听本机指定端口
        ServerSocket ss = new ServerSocket(6666);

        // 阻塞获取客户端的连接
        Socket s = ss.accept();

        // 读取搜索的关键字, 在本地进行搜索电影, 随机下载一部并返回
        ObjectInputStream ois = new ObjectInputStream(s.getInputStream());
        MovieKeyWord keyWord = (MovieKeyWord) ois.readObject();

        System.out.println(keyWord);


        // 从keyWord取出属性值, 进行搜索
        String moviePath = "file\\2.jpg";

        // 读取文件到内存
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(moviePath));

        // 图片的字节数据写入到Socket
        OutputStream os = s.getOutputStream();

        byte[] bys = new byte[1024];
        int len;
        // 本地文件读取完毕跳出循环
        while ((len = bis.read(bys)) != -1) {
            os.write(bys, 0, len);
        }

        os.close();
        bis.close();
        ois.close();
        s.close();
        ss.close();

    }
}
